package iso 
{
	import flash.display.*;
	import flash.geom.*;
	
	/**
	 * 等角世界基本对象
	 * @author StefanieKaka
	 */
	public class IsoObject extends Sprite 
	{
		/// 构造函数
		public function IsoObject(size : Number) 
		{
			m_size = size;
			m_position = new Point3D();
			m_velocity = new Point3D();
			updateScreenPosition();
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * iso 坐标系中位置的 point3D 坐标
		 */
		public function get position() : Point3D
		{
			return m_position;
		}
		
		public function set position(value : Point3D) : void
		{
			m_position = value;
			updateScreenPosition();
		}
		
		/// 获得对象的 3D 转换的深度
		public function get depth() : Number
		{
			return (m_position.x + m_position.z) * 0.866 - m_position.y * 0.707;
		}
		
		/**
		 * 指出该空间是否被占有
		 */
		public function get walkable() : Boolean
		{
			return m_walkable;
		}
		
		public function set walkable(value : Boolean) : void
		{
			m_walkable = value;
		}
		
		/**
		 * 对象的大小
		 */
		public function get size() : Number
		{
			return m_size;
		}
		
		/**
		 * 对象在 x-z 平面所占的大小
		 */
		public function get rect() : Rectangle
		{
			return new Rectangle(x - size / 2, z - size / 2, size, size);
		}
		
		/**
		 * 速度
		 */
		public function set velocity(value : Point3D) : void
		{
			m_velocity = value;
		}
		
		public function get velocity() : Point3D
		{
			return m_velocity;
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 重写方法
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function toString() : String
		{
			return "[IsoObject (x:" + m_position.x + ", y:" + m_position.y + ", z: " + m_position.z + ")]";
		}
		
		/**
		 * iso 坐标系中的 x 坐标
		 */
		override public function get x() : Number
		{
			return m_position.x;
		}
		
		override public function set x(value : Number) : void
		{
			m_position.x = value;
			updateScreenPosition();
		}
		
		/**
		 * iso 坐标系中的 y 坐标
		 */
		override public function get y() : Number
		{
			return m_position.y;
		}
		
		override public function set y(value : Number) : void
		{
			m_position.y = value;
			updateScreenPosition();
		}
		
		/**
		 * iso 坐标系中的 z 坐标
		 */
		override public function get z() : Number
		{
			return m_position.z;
		}
		
		override public function set z(value : Number) : void
		{
			m_position.z = value;
			updateScreenPosition();
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 保护域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/// 转换 iso 坐标系坐标到屏幕坐标系
		protected function updateScreenPosition() : void
		{
			var screenPos : Point = IsoUtils.isoToScreen(m_position);
			super.x = screenPos.x;
			super.y = screenPos.y;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////

		private var m_size : Number = NaN;
		private var m_position : Point3D = null;
		private var m_velocity : Point3D = null;
		private var m_walkable : Boolean = false;
	}

}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file